package com.cg.leetcode;

import org.junit.Test;

/**
 * 283.移动零
 *
 * @program: LeetCode->LeetCode_283
 * @description: 283.移动零
 * @author: cg
 * @create: 2021-08-31 16:05
 **/
public class LeetCode_283 {

    @Test
    public void test283() {
        moveZeroes(new int[]{0, 1, 0, 3, 12});
    }

    /**
     * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
     * <p>
     * 示例:
     * 输入: [0,1,0,3,12]
     * 输出: [1,3,12,0,0]
     * <p>
     * 说明:
     * 1) 必须在原数组上操作，不能拷贝额外的数组。
     * 2) 尽量减少操作次数。
     *
     * @param nums
     */
    public void moveZeroes(int[] nums) {
        //双指针解决
        //统计非零的个数
        int i = 0;
        for (int j = 0; j < nums.length; j++) {
            //只要不为0就往前挪
            if (nums[j] != 0) {
                //i指向的值和j指向的值交换
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                i++;
            }
        }
    }
    /*public void moveZeroes(int[] nums) {
        //把非零的往前挪
        if (nums == null || nums.length == 0) {
            return;
        }
        int index = 0;
        //一次遍历，把非零的都往前挪
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[index++] = nums[i];
            }
        }
        //后面的都是0,
        while (index < nums.length) {
            nums[index++] = 0;
        }
    }*/

}
